Buka potensi penuh NumPy dengan teknik pengindeksan array tingkat lanjut. Pelajari pengindeksan boolean, pengindeksan fancy, dan slicing untuk pemilihan data yang efisien.
Pengindeksan Array NumPy: Menguasai Teknik Pemilihan Tingkat Lanjut
NumPy, landasan komputasi ilmiah di Python, menyediakan alat yang ampuh untuk menangani array dan matriks multi-dimensi yang besar. Meskipun pengindeksan dan slicing dasar sangat penting, benar-benar menguasai NumPy melibatkan pendalaman teknik pemilihan yang lebih canggih. Metode ini memungkinkan manipulasi data yang canggih, memungkinkan pengguna untuk mengekstrak informasi yang mereka butuhkan dengan efisiensi yang luar biasa. Posting ini akan memandu Anda melalui seluk-beluk pengindeksan boolean dan pengindeksan fancy, menawarkan contoh dan wawasan praktis untuk audiens global.
Memahami Fondasi: Pengindeksan dan Slicing Dasar
Sebelum kita menjelajah ke wilayah yang lebih maju, rekap singkat tentang pengindeksan dan slicing dasar akan bermanfaat. Untuk array 1D, pengindeksan sangat mudah: arr[i] mengambil elemen pada indeks i. Slicing menggunakan sintaks arr[start:stop:step] untuk memilih rentang elemen.
Untuk array 2D, pengindeksan diperluas untuk memilih baris dan kolom. Misalnya, arr[row, column] mengakses elemen tertentu. Slicing dapat diterapkan secara independen ke baris dan kolom: arr[row_slice, column_slice].
Pertimbangkan array 2D sederhana:
import numpy as np
arr_2d = np.array([[1, 2, 3],
[4, 5, 6],
[7, 8, 9]])
# Mengakses sebuah elemen
print(arr_2d[1, 2]) # Output: 6
# Slicing baris dan kolom
print(arr_2d[0:2, 1:3])
# Output:
# [[2 3]
# [5 6]]
Meskipun efektif, metode ini dapat menjadi rumit saat berhadapan dengan kriteria pemilihan yang kompleks. Di sinilah teknik pengindeksan tingkat lanjut bersinar.
Pengindeksan Boolean: Memilih Data Berdasarkan Kondisi
Pengindeksan boolean, sering disebut sebagai pemilihan bersyarat, memungkinkan Anda untuk memilih elemen dari array berdasarkan kondisi boolean. Ini adalah teknik yang sangat ampuh untuk memfilter data. Anda membuat array boolean dengan bentuk yang sama dengan array asli, di mana True menunjukkan bahwa elemen yang sesuai harus dipilih, dan False menunjukkan pengecualian.
Bagaimana Cara Kerjanya
Proses ini biasanya melibatkan melakukan operasi perbandingan pada array. Operasi ini mengembalikan array boolean. Anda kemudian menggunakan array boolean ini untuk mengindeks array asli.
Contoh 1: Memilih Elemen yang Lebih Besar Dari Nilai
Katakanlah Anda memiliki dataset suhu global dan Anda ingin mengidentifikasi semua hari di mana suhu melebihi ambang batas tertentu.
# Asumsikan array 1D suhu dari berbagai kota di seluruh dunia
temperatures = np.array([25.5, 31.2, 18.9, 28.7, 22.1, 35.0, 15.6])
# Tetapkan ambang batas
threshold = 28.0
# Buat mask boolean
high_temperatures_mask = temperatures > threshold
print(high_temperatures_mask)
# Output: [False True False True False True False]
# Gunakan mask untuk memilih elemen
hot_days = temperatures[high_temperatures_mask]
print(hot_days)
# Output: [31.2 28.7 35. ]
Ini secara ringkas memilih semua suhu di atas 28.0 derajat. Outputnya adalah array 1D baru yang hanya berisi nilai-nilai yang memenuhi kondisi.
Contoh 2: Bekerja dengan Array 2D
Pengindeksan boolean juga dapat diterapkan ke array multi-dimensi. Saat digunakan dengan array 2D, mask boolean dengan bentuk yang sama akan mengembalikan array 1D yang berisi semua elemen yang masknya True.
# Array 2D yang mewakili angka penjualan untuk produk yang berbeda di berbagai wilayah
sales_data = np.array([[150, 200, 120],
[300, 180, 250],
[90, 220, 160]])
# Identifikasi angka penjualan di atas target tertentu
target_sales = 200
# Buat mask boolean
successful_sales_mask = sales_data >= target_sales
print(successful_sales_mask)
# Output:
# [[False True False]
# [ True False True]
# [False True False]]
# Pilih angka penjualan yang sesuai
selected_sales = sales_data[successful_sales_mask]
print(selected_sales)
# Output: [200 300 250 220]
Ini mengembalikan array 1D dari semua angka penjualan yang memenuhi atau melampaui target. Ini adalah cara yang ampuh untuk memfilter data multidimensi tanpa loop eksplisit.
Pengindeksan Boolean dengan Beberapa Kondisi
Anda dapat menggabungkan beberapa kondisi boolean menggunakan operator logika:
&: Logika AND per elemen|: Logika OR per elemen~: Logika NOT per elemen
Catatan Penting: Saat menggabungkan kondisi, setiap kondisi individual harus diapit tanda kurung karena prioritas operator Python.
# Pilih angka penjualan yang antara 150 dan 250 (inklusif)
condition_low = sales_data >= 150
condition_high = sales_data <= 250
between_150_and_250 = sales_data[condition_low & condition_high]
print(between_150_and_250)
# Output: [150 200 180 250 220 160]
Ini menunjukkan cara mengekstrak data yang termasuk dalam rentang tertentu, tugas umum dalam analisis data.
Pengindeksan Fancy: Memilih Elemen Menggunakan Array Integer
Pengindeksan fancy adalah teknik pemilihan tingkat lanjut lainnya yang memungkinkan Anda untuk memilih elemen menggunakan array integer. Ini berbeda dari slicing, yang memilih blok data yang berdekatan. Pengindeksan fancy memungkinkan Anda untuk memilih elemen arbitrer dari array berdasarkan indeksnya.
Bagaimana Cara Kerjanya
Anda menyediakan array indeks ke operator pengindeksan. NumPy kemudian mengembalikan array baru di mana elemen-elemen diurutkan sesuai dengan indeks yang disediakan.
Contoh 1: Memilih Elemen Tertentu dalam Array 1D
Bayangkan Anda memiliki daftar ID pengguna dan Anda hanya ingin mengambil data untuk pengguna tertentu.
# Daftar contoh ID pengguna
user_ids = np.array([101, 105, 110, 102, 115, 108])
# Indeks pengguna yang kita minati
selected_indices = np.array([0, 3, 5]) # Sesuai dengan ID pengguna pada indeks 0, 3, dan 5
# Pilih data untuk pengguna ini
selected_users = user_ids[selected_indices]
print(selected_users)
# Output: [101 102 108]
Ini mengembalikan array baru yang hanya berisi user_ids pada indeks yang ditentukan.
Contoh 2: Pengindeksan Fancy dengan Array 2D
Pengindeksan fancy menjadi sangat kuat dengan array multi-dimensi. Saat Anda menggunakan array integer untuk mengindeks array 2D, Anda dapat memilih baris, kolom, atau bahkan elemen individual tertentu dengan cara yang tidak berdekatan.
Ada dua cara utama untuk menggunakan pengindeksan fancy dengan array 2D:
- Memilih Baris: Menyediakan array 1D indeks baris.
- Memilih Elemen Tertentu (Pasangan Baris, Kolom): Menyediakan dua array 1D indeks - satu untuk baris dan satu untuk kolom. Array ini harus memiliki panjang yang sama, dan elemen ke-i dari array indeks baris dan elemen ke-i dari array indeks kolom menentukan elemen unik untuk dipilih.
Memilih Baris Tertentu
Mari kita pertimbangkan dataset harga saham untuk perusahaan yang berbeda selama beberapa hari. Kami ingin mengambil data untuk perusahaan tertentu.
# Harga saham untuk 3 perusahaan selama 4 hari
# Baris mewakili hari, kolom mewakili perusahaan
stock_prices = np.array([[100, 150, 200],
[105, 152, 205],
[110, 155, 210],
[115, 160, 215]])
# Indeks perusahaan yang ingin kita periksa (misalnya, perusahaan pada indeks 0 dan perusahaan pada indeks 2)
company_indices = np.array([0, 2])
# Pilih data untuk perusahaan ini di semua hari
selected_companies_data = stock_prices[:, company_indices]
print(selected_companies_data)
# Output:
# [[100 200]
# [105 205]
# [110 210]
# [115 215]]
Di sini, : memilih semua baris, dan company_indices memilih kolom tertentu. Hasilnya adalah array 2D baru di mana setiap kolom sesuai dengan perusahaan yang dipilih.
Memilih Elemen Tertentu menggunakan Pasangan Baris dan Kolom
Di sinilah pengindeksan fancy menawarkan fleksibilitas paling besar. Anda dapat menentukan elemen arbitrer dengan menentukan indeks baris dan kolomnya secara bersamaan.
# Grid yang mewakili kepadatan populasi di berbagai zona dan sektor
population_density = np.array([[1000, 1200, 800, 1500],
[900, 1100, 750, 1400],
[1300, 1400, 950, 1600],
[850, 1050, 700, 1350]])
# Kami ingin memeriksa kepadatan pada kombinasi zona-sektor tertentu.
# Katakanlah kita tertarik pada:
# - Zona 0, Sektor 1 (baris 0, kolom 1)
# - Zona 2, Sektor 0 (baris 2, kolom 0)
# - Zona 1, Sektor 3 (baris 1, kolom 3)
# - Zona 3, Sektor 2 (baris 3, kolom 2)
row_indices = np.array([0, 2, 1, 3])
column_indices = np.array([1, 0, 3, 2])
# Pilih kepadatan populasi di lokasi spesifik ini
specific_locations_density = population_density[row_indices, column_indices]
print(specific_locations_density)
# Output: [1200 1300 1400 700]
Outputnya adalah array 1D yang berisi kepadatan populasi pada koordinat yang tepat yang ditentukan oleh pasangan indeks.
Wawasan Utama: Bentuk array output ditentukan oleh bentuk array indeks. Jika kedua array indeks adalah 1D dan memiliki panjang yang sama N, output akan menjadi array 1D dengan panjang N. Jika salah satu array indeks multi-dimensi, array output akan mewarisi bentuk itu.
Pengindeksan Fancy dan Broadcasting
Saat menggunakan pengindeksan fancy dengan beberapa array indeks yang memiliki bentuk berbeda, aturan broadcasting NumPy berlaku. Misalnya, jika Anda mengindeks array 2D dengan array 1D untuk baris dan satu integer untuk kolom, broadcasting secara efektif akan memperluas indeks kolom tunggal itu agar sesuai dengan jumlah baris.
# Mari kita pilih semua elemen dari dua baris pertama, tetapi hanya dari kolom ketiga
indices_rows = np.array([0, 1]) # Indeks baris
index_col = 2 # Indeks kolom
selected_subset = population_density[indices_rows, index_col]
print(selected_subset)
# Output: [800 750]
Dalam hal ini, index_col (yaitu 2) di-broadcast agar sesuai dengan bentuk indices_rows (yaitu (2,)), secara efektif membuat pasangan indeks (0, 2) dan (1, 2).
Menggabungkan Pengindeksan Boolean dan Fancy
Anda juga dapat menggabungkan pengindeksan boolean dan pengindeksan fancy untuk membuat pola pemilihan yang lebih kompleks. Misalnya, Anda mungkin pertama-tama memfilter baris berdasarkan kondisi dan kemudian menggunakan pengindeksan fancy untuk memilih kolom tertentu dari baris yang difilter tersebut.
Mari kita tinjau kembali contoh sales_data:
# sales_data = np.array([[150, 200, 120],
# [300, 180, 250],
# [90, 220, 160]])
# Katakanlah kita hanya ingin mempertimbangkan baris di mana setidaknya satu angka penjualan di atas 200
# Buat mask boolean untuk baris
# Kami memeriksa apakah ada elemen dalam baris yang lebih besar dari 200
row_mask = np.any(sales_data > 200, axis=1)
print(row_mask)
# Output: [False True True]
# Terapkan mask baris ini untuk memilih baris yang relevan
filtered_rows = sales_data[row_mask]
print(filtered_rows)
# Output:
# [[300 180 250]
# [ 90 220 160]]
# Sekarang, dari baris yang difilter ini, mari kita gunakan pengindeksan fancy untuk memilih kolom tertentu.
# Misalkan kita menginginkan kolom pertama dan ketiga dari baris yang difilter ini.
row_indices_for_fancy = np.array([0, 1]) # Indeks dalam array filtered_rows
column_indices_for_fancy = np.array([0, 2]) # Indeks kolom yang kita inginkan
final_selection = filtered_rows[row_indices_for_fancy, column_indices_for_fancy]
print(final_selection)
# Output: [300 160]
Contoh ini menggambarkan skenario di mana Anda pertama-tama memfilter data Anda berdasarkan kondisi yang luas (baris dengan penjualan tinggi) dan kemudian secara selektif mengekstrak titik data tertentu dari baris yang difilter tersebut.
Aplikasi Praktis dan Perspektif Global
Teknik pengindeksan tingkat lanjut ini bukan hanya konstruksi teoretis; mereka adalah alat yang sangat diperlukan dalam aplikasi ilmu data dunia nyata di seluruh dunia:
- Analisis Keuangan: Memilih harga saham untuk perusahaan tertentu pada tanggal tertentu, atau mengidentifikasi perdagangan yang memenuhi ambang batas profitabilitas tertentu.
- Ilmu Iklim: Memfilter data suhu atau curah hujan untuk wilayah geografis atau periode waktu tertentu berdasarkan kriteria yang ditentukan. Misalnya, mengidentifikasi wilayah rawan kekeringan (misalnya, bagian Australia, wilayah Sahel di Afrika) dengan memilih data di bawah tolok ukur curah hujan tertentu.
- E-commerce: Segmentasi data pelanggan untuk mengidentifikasi pelanggan bernilai tinggi atau produk dengan metrik penjualan tertentu di berbagai pasar (misalnya, Eropa, Asia, Amerika Utara).
- Perawatan Kesehatan: Menganalisis data pasien untuk memilih catatan individu dengan kondisi atau riwayat perawatan tertentu di berbagai populasi.
- Pembelajaran Mesin: Menyiapkan dataset dengan memilih fitur atau sampel berdasarkan kriteria kompleks, atau mengekstrak koefisien model untuk parameter tertentu.
Kemampuan untuk memilih data secara tepat dan efisien sangat penting untuk membangun model yang akurat, memperoleh wawasan yang bermakna, dan membuat keputusan yang tepat, terlepas dari lokasi geografis atau industri.
Pertimbangan Kinerja
Pengindeksan tingkat lanjut NumPy sangat dioptimalkan. Operasi yang memerlukan loop Python eksplisit sering kali di-vektorisasi oleh NumPy, yang mengarah pada peningkatan kinerja yang signifikan. Namun, penting untuk menyadari beberapa nuansa:
- Pengindeksan boolean umumnya mengembalikan array 1D dari elemen yang dipilih. Jika Anda perlu mempertahankan bentuk asli untuk operasi tertentu, Anda mungkin perlu mengubah bentuk atau menggunakan teknik lain.
- Pengindeksan fancy mengembalikan salinan data. Jika array indeks adalah integer, hasilnya adalah salinan. Jika array indeks adalah boolean, hasilnya juga merupakan salinan. Ini berarti perubahan pada array yang dikembalikan tidak memengaruhi array asli.
- Untuk array yang sangat besar dan skema pengindeksan yang kompleks, penggunaan memori dapat menjadi faktor. Operasi NumPy membuat array perantara, yang menghabiskan memori.
Ketika kinerja sangat penting, terutama dalam aplikasi yang sensitif terhadap waktu atau ketika bekerja dengan dataset yang sangat besar, memprofilkan kode Anda dan memahami operasi NumPy yang mendasarinya dapat membantu Anda mengoptimalkan lebih lanjut. Ini mungkin melibatkan pemilihan antara pengindeksan boolean dan fancy, atau menyusun ulang data Anda.
Praktik Terbaik untuk Pengindeksan Tingkat Lanjut
Untuk memanfaatkan kemampuan pengindeksan tingkat lanjut NumPy secara efektif:
- Pahami Data Anda: Definisikan dengan jelas kriteria pemilihan sebelum menulis kode.
- Gunakan Nama Variabel yang Bermakna: Beri nama mask boolean dan array indeks Anda secara deskriptif (misalnya,
high_value_customers_mask,target_product_indices). - Prioritaskan Keterbacaan: Meskipun kode yang ringkas itu baik, prioritaskan kode yang mudah dipahami oleh orang lain (dan diri Anda di masa mendatang). Gunakan tanda kurung dengan tepat untuk kondisi boolean gabungan.
- Uji Secara Bertahap: Bangun operasi pengindeksan yang kompleks langkah demi langkah, verifikasi output di setiap tahap.
- Manfaatkan Fungsi NumPy: Gunakan fungsi seperti
np.where()untuk pemilihan bersyarat yang mungkin mengembalikan indeks atau nilai, ataunp.ix_()untuk membuat grid lengkap dari array indeks, yang dapat berguna dalam skenario tertentu. - Perhatikan Salinan vs. Tampilan: Ingatlah bahwa pengindeksan fancy dan pengindeksan boolean biasanya mengembalikan salinan, bukan tampilan data asli.
Kesimpulan
Teknik pengindeksan array tingkat lanjut NumPy, yaitu pengindeksan boolean dan pengindeksan fancy, sangat penting untuk melakukan pemilihan dan manipulasi data yang canggih di Python. Mereka memberdayakan ilmuwan data, analis, dan peneliti di seluruh dunia untuk mengekstrak secara tepat data yang mereka butuhkan, memungkinkan wawasan yang lebih dalam dan analisis yang lebih kuat. Dengan menguasai teknik-teknik ini, Anda dapat membuka kekuatan penuh NumPy untuk proyek berbasis data Anda, berkontribusi pada kemajuan di bidang-bidang mulai dari keuangan global dan penelitian iklim hingga pengobatan yang dipersonalisasi dan kecerdasan buatan. Terus jelajahi, bereksperimen, dan integrasikan metode pemilihan yang kuat ini ke dalam alur kerja NumPy Anda.